package api

import (
	"context"

	"github.com/go-kratos/kratos/pkg/log"

	"time"

	"github.com/go-kratos/kratos/pkg/naming/etcd"
	"github.com/go-kratos/kratos/pkg/net/netutil/breaker"
	"github.com/go-kratos/kratos/pkg/net/rpc/warden"

	xtime "github.com/go-kratos/kratos/pkg/time"

	"github.com/go-kratos/kratos/pkg/net/rpc/warden/resolver"
	"google.golang.org/grpc"
)

// AppID .
const AppID = "DemoADD_APP_ID"

// DemoCli DemoCli
var DemoCli DemoClient

func init() {
	// NOTE: 注意这段代码，表示要使用etcd进行服务发现 ,其他事项参考discovery的说明
	// NOTE: 在启动应用时，可以通过flag(-etcd.endpoints) 或者 环境配置(ETCD_ENDPOINTS)指定etcd节点
	// NOTE: 如果需要自己指定配置时 需要同时设置DialTimeout 与 DialOptions: []grpc.DialOption{grpc.WithBlock()}
	resolver.Register(etcd.Builder(nil))

}

// NewClient new member grpc client
func NewClient(cfg *warden.ClientConfig, opts ...grpc.DialOption) (DemoClient, error) {
	client := warden.NewClient(cfg, opts...)
	// 这里使用etcd scheme
	conn, err := client.Dial(context.Background(), "etcd://kratos_etcd/"+AppID)
	if err != nil {
		return nil, err
	}
	// 注意替换这里：
	// NewDemoClient方法是在"api"目录下代码生成的
	// 对应proto文件内自定义的service名字，请使用正确方法名替换
	return NewDemoClient(conn), nil
}

// InitNewClient InitNewClient
func InitNewClient() {
	conf := &warden.ClientConfig{
		Dial:    xtime.Duration(time.Second * 10),
		Timeout: xtime.Duration(time.Second * 10),
		Breaker: &breaker.Config{
			Window:  xtime.Duration(3 * time.Second),
			K:       2,
			Bucket:  10,
			Request: 20,
		},
	}
	var err error
	DemoCli, err = NewClient(conf)
	if err != nil {
		log.Error(err.Error(), err)
	}
}

// 生成 gRPC 代码
//go:generate kratos tool protoc --grpc api.proto
